Storage pages can be used in association with a data storage application that writes and/or reads data from a persistency layer that can include active data stored in fast but relatively expensive memory that is in turn written to a less expensive storage for longer term retention. The persistence layer can ensure that changes made within the data storage application are durable and that the data storage application can be restored to a most recent committed state after a restart. A committed state is achieved by writing the changes made to data in the persistence layer to the longer term storage. Data are stored in the longer term storage are organized in storage pages, a term that refers to a unit of physical storage.
A shadow paging technique can be used in conjunction with data storage applications to avoid overwriting an existing version of a page with changes until the changes are ready to be committed to longer term storage. For example, shadow paging can be used to undo changes that were written to the longer term storage since a most recent savepoint. A shadow page can be allocated to retain the original state of a logical page when the logical page is to be modified. A storage page retained in the longer term storage at a most recent savepoint are not overwritten until a subsequent savepoint is successfully completed. Instead, new physical pages are used to store changed logical pages. Therefore, until the subsequent savepoint is written to longer term storage, two physical pages may exist for one logical page: a shadow page containing the version written during the most recent savepoint, and a current physical page reflecting changes written to longer term storage since the most recent savepoint.